package com.ykc.helper;

import com.ykc.spring.*;
import com.ykc.utils.ClassUtil;

import java.lang.annotation.Annotation;
import java.util.*;

public class ClassHelper {

    private static final Set<Class<?>> CLASS_SET;

    //获取com.luban下的所有bean
//    public ClassHelper() {
    static {
        String basePackage="com.ykc";
        CLASS_SET= ClassUtil.getClassSet(basePackage);
    }

    public static Set<Class<?>> getAllClass(){
        return CLASS_SET;
    }


    /**
     * 获取基础包名下所有 Bean 类
     */
    public static Set<Class<?>> getBeanClassSet() {
        Set<Class<?>> beanClassSet = new HashSet<Class<?>>();
        beanClassSet.addAll(getClassSet());
        return beanClassSet;
    }

    /**
     * 获取基础包名下所有Component以及Service的 Bean 类
     */
    public static List<Class<?>> getClassSet() {
        List<Class<?>> classList = new ArrayList<Class<?>>();
        for (Class<?> clazz : CLASS_SET) {
            if (clazz.isAnnotationPresent(Component.class)||clazz.isAnnotationPresent(Service.class)||clazz.isAnnotationPresent(Controller.class)) {
                //表示这个类是一个bean
                //判断当前bean是单例bean还是原型(protope)bean
                //
                classList.add(clazz);
            }
        }
        return classList;
    }

    /**
     * 获取基础包名下某父类的所有子类 或某接口的所有实现类
     * */
    public static Set<Class<?>> getClassSetBySuper(Class<?> superClass) {
        Set<Class<?>> classSet=new HashSet<Class<?>>();
        for (Class<?> cls:CLASS_SET){
            //isAssignableFrom() 指 superClass 和 cls 是否相同或 superClass 是否是 cls 的父类/接口
            //判断superClass是否为cls的父类
            if (superClass.isAssignableFrom(cls)&&!superClass.equals(cls)){
                classSet.add(cls);
            }
        }
        return classSet;
    }

    /**
     * 获取基础包名下带有某注解的所有类
     */
    public static Set<Class<?>> getClassSetByAnnotation(Class<? extends Annotation> annotationClass) {
        Set<Class<?>> classSet = new HashSet<Class<?>>();
        for (Class<?> cls : CLASS_SET) {
            if (cls.isAnnotationPresent(annotationClass)) {
                classSet.add(cls);
            }
        }
        return classSet;
    }

    public static Set<Class<?>> getControllerClassSet() {
        Set<Class<?>> classList = new HashSet<>();
        for (Class<?> clazz : CLASS_SET) {
            if (clazz.isAnnotationPresent(Controller.class)) {
                //表示这个类是一个bean
                //判断当前bean是单例bean还是原型(protope)bean
                //
                classList.add(clazz);
            }
        }
        return classList;
    }
}
